package service

import (
	"context"
	"errors"
	"fmt"
	"go-mall/app/client/dto"
	"go-mall/app/client/model"
	"go-mall/global"
	"go-mall/pkg/util"
	"go.uber.org/zap"
	"gopkg.in/gomail.v2"
	"gorm.io/gorm"
	"log"
	"time"
)

type UserService struct{}

func (s *UserService) Register(u model.User, code string) (userInter model.User, err error) {
	var user model.User
	if code == "" {
		fmt.Println("code", code)
		return userInter, errors.New("请上传邮箱验证码")
	}
	if !errors.Is(global.DB.Where("email = ?", u.Email).First(&user).Error, gorm.ErrRecordNotFound) { // 判断用户名是否注册
		return userInter, errors.New("已注册")
	}
	// 获取redis 邮箱验证码缓存
	var val string
	val, err = global.RedisDB.Get(context.Background(), u.Email).Result()
	if err != nil {
		global.LOG.Error("获取邮箱验证码Redis缓存错误,err:", zap.Error(err))
		return userInter, errors.New("验证码错误 不存在")
	}
	if val != code {
		return userInter, errors.New("验证码不正确")
	}
	// 密码hash加密 注册
	u.Password = util.BcryptHash(u.Password)
	err = global.DB.Create(&u).Error
	return u, err
}

func (s *UserService) Login(u model.User, code string) (userInter *model.User, err error) {
	var user model.User

	fmt.Println("登录", u.Email)
	if u.Email == "" {
		return &user, errors.New("用户名不存在")
	}

	err = global.DB.Where("email = ?", u.Email).First(&user).Error
	if err == nil {
		// 验证码登录
		if code != "" {
			var val string
			val, err = global.RedisDB.Get(context.Background(), u.Email).Result()
			if val != code {
				return nil, errors.New("登录失败 验证码不正确！")
			} else {
				return &user, err
			}
		}
		if u.Password == "" {
			return &user, errors.New("请输入密码")
		}
		// 密码登录
		if ok := util.BcryptCheck(u.Password, user.Password); !ok {
			return nil, errors.New("账号或密码不正确！")
		}
		return &user, err
	}
	return &user, errors.New("用户不存在！")
}

func (s *UserService) SendEmail(e dto.EmailReq) error {
	emailCode := util.CreateCaptcha()

	host := global.CONFIG.Email.Host
	port := global.CONFIG.Email.Port
	user := global.CONFIG.Email.From   //邮件发送者
	smtp := global.CONFIG.Email.Secret //授权码 （QQ邮箱开通smtp时会给授权码）
	m := gomail.NewMessage(
		gomail.SetEncoding(gomail.Base64),
	)
	//m.SetHeader("From", global.CONFIG.Email.From) // 邮件发送者
	m.SetHeader("From", m.FormatAddress(global.CONFIG.Email.From, global.CONFIG.Email.Nickname)) // 增加发件人别名
	m.SetHeader("To", e.Email)                                                                   // 邮件接受者                                                           // 邮件接收者
	m.SetHeader("Subject", "邮箱验证码")                                                              // 邮件主题                                                       // 邮件主题
	m.SetBody("text/html", "验证码："+emailCode+" 五分钟内有效")                                           // 邮件内容

	d := gomail.NewDialer(host, port, user, smtp)
	err := d.DialAndSend(m)
	if err != nil {
		log.Println("发送失败", err)
		return errors.New("邮箱验证码发送失败")
	}
	ctx := context.Background()
	// 存邮箱验证码到redis 缓存
	err = global.RedisDB.Set(ctx, e.Email, emailCode, 5*time.Minute).Err() //  10*time.Minute ：代表5分钟
	fmt.Println("缓存时间", 5*time.Minute)
	if err != nil {
		panic(err)
	}
	return err
}
